package communication;

import java.net.Socket;
import java.util.Iterator;
import java.util.Map;

import server.ServerInternals;

/**
 * Message Client -> Serveur lors de la connection d'un client
 * 
 * Un objet de cette classe doit etre envoye a l'application serveur lors de la connection d'un nouveau client.
 * Cet objet permet l'authentification du client.
 * 
 * @author Julien Roch
 * @version 1.0
 */
public class ClientConnect extends ComCliSrv{

	/**
	 * Pour la serialization
	 */
	private static final long serialVersionUID = 3315330710394329298L;
	
	/**
	 * Le pseudo de l'utlisateur qui se connecte
	 */
	private String pseudo;
	private String password;
	
	/**
	 * Constructeur
	 * @param pseudo le pseudo du joueur
	 * @param password le mot de passe
	 */
	public ClientConnect(String pseudo, String password){
		this.pseudo = pseudo;
		this.password = password;
	}
	
	/**
	 * Enregistre le client dans la liste des clients connectes et notifie tous les clients de la nouvelle liste de clients et de parties.
	 * Renvoie un message d'erreur en cas de mauvais couple pseudo/password
	 * @param internals Le modele du serveur (contenu dans l'application serveur)
	 */
	 @Override
	public void handleServerInternals(ServerInternals internals) {
		if(internals.getDatabase().checkUser(pseudo, password)){
			if(internals.getClients().containsValue(pseudo)){	// le client est deja connecté, qu'il aille se faire frire!
				internals.sendDataToClient(socket, new Error(Error.ErrorType.USER_ALREADY_CONNECTED));
				return;
			}
			// Ajout du client a la liste des clients connus du serveur
			internals.addClient(socket, pseudo);
			// Affichage de la liste des clients
			Iterator<Map.Entry<Socket, String> > it = internals.getClients().entrySet().iterator();
			System.out.println("Nouvelle table de clients: "); /** @debug */
		    while (it.hasNext()) {
		        Map.Entry<Socket,String> pairs = (Map.Entry<Socket,String>)it.next();
		        System.out.println(pairs.getKey() + "\t\t" + pairs.getValue());
		    }
		    
		    // envoie la nouvelle liste
		    ClientListChanged c = new ClientListChanged(internals.getClients().values().toArray());
		    internals.sendDataToAllClients(c);
		    
		    // Envoie la liste des parties
		    internals.sendGameList();
		    
		}else{
			// erreur de connection
			internals.sendDataToClient(socket, new Error(Error.ErrorType.LOGIN_ERROR));
		}
	}

}
